/*
 * @Author: 王汝鹏
 * @Date: 2020-11-25 15:57:26
 * @LastEditTime: 2022-03-07 16:27:24
 * @LastEditors: Please set LastEditors
 * @Description: 子进程任务，负责读取数据文件并处理为报文格式，加载在缓存中等待父进程使用
 * @FilePath: \x600\child.js
 */

const Devicebuffe = require('./newcreatebuffer');
let devicebuffe = new Devicebuffe();

//  接收的信号: { "type":"类型", "value":"消息内容" }
//  信号1: type="read",  value="当前缓存剩余数量"
//
//  触发的信号: { "type":"类型", "value":"消息内容" }
//  信号1: type="ready",  value="命令描述,如'子程序已就绪'"
//  信号2: type="exit",   value="命令描述,如'子程序已退出'"
//  信号3: type="data",   value="传输的数据"

//  ===程序启动配置===
//  缓存的文件数量, 缓存的数据数量小于这个数的时候, 就读取新的文件并缓存到内存中
const CACHE_FILE_LENGTH = 5;
//  最小文件名称列表数量, 文件路径列表为读取文件做准备, 不足时从头开始重新循环文件列表
const MIN_FILE_PATH_LENGTH = 5;
//  主进程缓存的数据数量
const MASTER_CACHE_LENGTH = 5;
//  子进程工作定时器间隔时间(ms), 子进程多长时间检查一下自己缓存数据的数量
const WORK_INTERVAL_TIME = 10;

//  ===程序运行变量===
//  缓存的数据
let Cache_Datas = [];
//  第一次子进程就绪标记
let ready_flag = false;
//  读取中标记
let reading_flag = false;


//  子进程工作的定时器, 已固定的频率检查缓存数据的数量, 不足则读取新的文件并缓存到内存中
setInterval(function() {
  //  子进程缓存数据数量 不足配置的个数(CACHE_FILE_LENGTH), 就进行补充(读取文件并格式化并缓存到内存中)
  if (Cache_Datas.length < CACHE_FILE_LENGTH) {
    //  正在读取中 
    if (reading_flag == true) return;
    reading_flag = true;

    //  文件路径列表数量不足, 从新开始新一轮的文件读取
    if(devicebuffe.arrlist.length < MIN_FILE_PATH_LENGTH){
      devicebuffe.arrlist = [...devicebuffe.arrlist, ...devicebuffe.sotrlist()];
    }

    //  读取并处理一个文件
    devicebuffe.pretreatment();
    Cache_Datas = devicebuffe.pretreatment_data;

    //  读取完成
    reading_flag = false;
  } else {
    //  第一次程序启动并读满了缓存, 则更新子进程就绪标记
    if (ready_flag == false) {
      ready_flag = true;
      //  【触发】子程序就绪信号
      process.send({ type:"ready", value:"子程序已就绪" });
    }
  }
}, WORK_INTERVAL_TIME);

//  接收父进程发送的消息
process.on("message", function(msg) {
  //  直解析固定的协议类型数据, { type, value }
  if (msg instanceof Object) {
    //  type:消息类型， value:消息值
    let { type, value } = msg;
    //  【信号】父进程读取一个文件数据
    if (type=="read") {
      //  value为主进程缓存剩余数据的数量, 做差将父进程缓存的数据补足为配置的数量(MASTER_CACHE_LENGTH)
      for (let i=0; i<MASTER_CACHE_LENGTH-value; i++) {
        //  子进程缓存数据数量为0, 无法对父进程缓存进行补充
        if (Cache_Datas.length <= 0) break;

        //  从子进程缓存中取出一个数据, 发送给父进程进行数据补充
        let data = Cache_Datas.shift();
        process.send({ type:"data", value:data });
      }
    }

    //  【信号】退出程序
    if (type=="exit") {
      process.exit();
    }
  }
});

//  进程退出事件处理函数 
process.on("exit", function(code) {
  console.log(`[子进程]: 进程已结束, code=${code}`);
  //  【触发】发结束(exit)信号给父进程
  process.send({ type:"exit", value:"子程序已退出" });
});
